.. _cmlHomeMoveStart: cmlHomeMoveStart ================================ -------------------------------- SYNOPSYS ````````````` .. code-block:: none VT_I4 cmlHomeMoveStart ([in] VT_I4 BoardID, [in] VT_I4 Channel) DESCRIPTION ````````````` - 원점복귀 작업을 수행합니다. cmlHomeMove() 함수는 모션이 완료되기 전까지 반환되지 않으며, cmlHomeMoveStart() 함수는 모션을 시작시킨 후에 바로 반환됩니다. \ - 이 함수의 사용과 호출에 있어, 제공된 ㈜커미조아의 함수 헤더 Visual Basic 에서는 함수의 첨두어 cml 가 붙지 않습니다. PARAMETER ````````````` ▶ BoardId: 사용자가 설정한 디바이스(보드) ID. ▶ Channel : 축(채널) 번호. 축번호는 상수값으로 0번째 채널을 기준 채널로 임의의 채널을 설정할 수 있습니다. ▶ IsBlocking : 완료될 때까지 기다리는 동안 윈도우 메시지를 블록(Blocking)할 것인지를 결정합니다. .. csv-table:: :widths: 10 90 :header-rows: 1 :stub-columns: 0 Value, Meaning "| 0 또는 cmlFALSE", " | 블록(Blocking)을 하지 않습니다. 따라서 해당 모션이 | 완료되는 동안에도 윈도우 이벤트를 처리합니다." "| 1 또는 cmlTRUE"," | 블록(Blocking)을 합니다. 따라서 해당 모션이 완료되는 | 동안에는 윈도우 이벤트가 처리되지 않습니다." RETURN VALUE ````````````` +------------+-----------+ | Value | Meaning | +============+===========+ | 음수 | 수행 실패 | +------------+-----------+ | ERR_NONE | 수행 성공 | +------------+-----------+ REFERENCE ``````````````` - cmlHomeMoveStart() 함수를 사용하는 경우에는 cmlSxIsDone(), cmlSxWaitDone() 또는 cmlMxIsDone(), cmlMxWaitDone() 함수를 사용하여 모션의 완료를 확인(確認)할 수 있습니다. 그러나 가장 바람직한 방법은 cmlHomeWaitDone() 함수를 사용하는 것이 좋습니다. \ - cmlHomeMove() 함수를 사용하는 경우에는 내부적으로 루프를 수행하면서 모션이 완료되기를 기다리는데, 이때 “Blocking Mode”설정에 따라 윈도우 이벤트를 처리하는 방식이 달라집니다. .. note:: "윈도우 이벤트란느 것은 무엇입니까?" 윈도우 운영체제는 Event Driven 혹은 Message Driven 방식의 구조로 되어 있습니다. 각 응용프로그램은 메시지 큐(Queue)를 가지고 있으며, 정확히 말하면, 메시지를 사용해 이벤트를 통지하는 방식으로 설계되어 있습니다. 윈도우 메시지를 처리한다는 것은 메시지 큐에서 메시지를 하나씩 꺼내서 윈도우 프로시저에 전송한다는 것을 의미하며, 이것은 그 행선지가 되는 윈도우에 전송되어 처리됩니다. EXAMPLE ``````````` - 본 예제는 cmlHomeMoveStart() 함수를 이용하여 X1, Y1 축의 원점복귀를 수행하는 함수입니다. 원점복귀에 대한 환경설정은 이미 이루어진 것으로 가정합니다. .. code-block:: c++ :linenos: :emphasize-lines: 5 C/C++ #include "ComiMLink2_SDK.h" #include "ComiMLink2_SDK_Def.h" // BoardID 는 0 으로 선언되었다고 가정함 #define DEV0 0 /************************************************************ * OnProgramInitial : 이 함수는 가상의 함수로서 프로그램 초기화 루틴이 * 적용되는 부분을 의미합니다. *************************************************************/ void OnProgramInitial() { long m_nNumDevices; long m_DeviceList[16]; long m_nNumAxes; cmlLoadDll(); if(cmlGnLoadDevice (&m_nNumDevices, m_DeviceList, &m_nNumAxes)!= cmlERR_NONE) { // 에러메시지 출력 return; } } /*************************************************************** * OnHomeSetSpeed : 이 함수는 속도설정의 변경이 필요할 때 * 호출되는 가상의 함수 입니다. 이때 m_fVwork, m_fAcc, m_fDec 변수를 * 통하여 속도, 가속도 , 감속도 값이 적젃하게 젂달된다고 가정합니다. ***************************************************************/ void OnHomeSetSpeed() { //각 축(Axis)의 기본 속도를 설정 합니다. //X1 축의 홈복귀 모드를 설정합니다. cmlHomeSetConfig(DEV0, cmlX1, cmlHPID_HOME_MODE, cmlHOME_MODE_ORG); //Y1 축의 홈복귀 모드를 설정합니다. cmlHomeSetConfig(DEV0, cmlY1, cmlHPID_HOME_MODE, cmlHOME_MODE_ORG); //X1 축의 홈복귀 방향을 설정합니다. cmlHomeSetConfig(DEV0, cmlX1, cmlHPID_HOME_DIR, cmlDIR_N); //Y1 축의 홈복귀 방향을 설정합니다. cmlHomeSetConfig(DEV0, cmlY1, cmlHPID_HOME_DIR, cmlDIR_N); //X1 축의 홈복귀 추가 이동 거리를 설정합니다. cmlHomeSetOffset(DEV0, cmlX1, 1000); //Y1 축의 홈복귀 추가 이동 거리를 설정합니다. cmlHomeSetOffset(DEV0, cmlY1, 1000); // X1 축 홈복귀 속도패턴 설정 // cmlHomeSetSpeedPattern(DEV0, cmlX1, 0, cmlSPEED_SCURVE, m_fVwork0, m_fAcc0, m_fDec0); cmlHomeSetSpeedPattern(DEV0, cmlX1, 1, cmlSPEED_SCURVE, m_fVwork1, m_fAcc1, m_fDec1); cmlHomeSetSpeedPattern(DEV0, cmlX1, 2, cmlSPEED_SCURVE, m_fVwork2, m_fAcc2, m_fDec2); // Y1 축 홈복귀 속도패턴 설정 // cmlHomeSetSpeedPattern(DEV0, cmlY1, 0, cmlSPEED_SCURVE, m_fVwork0, m_fAcc0, m_fDec0); cmlHomeSetSpeedPattern(DEV0, cmlY1, 1, cmlSPEED_SCURVE, m_fVwork1, m_fAcc1, m_fDec1); cmlHomeSetSpeedPattern(DEV0, cmlY1, 2, cmlSPEED_SCURVE, m_fVwork2, m_fAcc2, m_fDec2); } /*************************************************************** * OnHomeReturn : 이 함수는 가상의 함수로서 원점복귀를 실행합니다. ****************************************************************/ void OnHomeRetrun() { 출력 출력 // X1 축 원점복귀 시작 // if(cmlHomeMoveStart(BoardID, cmlX1, cmlDIR_N) != cmlERR_NONE){ // 에러메시지 출력 return; } // Y1 축 원점복귀 시작 // if(cmlHomeMoveStart(BoardID, cmlY1, cmlDIR_N) != cmlERR_NONE){ // 에러메시지 출력 return; } // X1&Y1 두축의 원점복귀 작업이 완료될 때까지 기다릮다. // if(cmlHomeWaitDone(BoardID, cmlX1, cmlFALSE) != cmlERR_NONE) // 에러메시지 if(cmlHomeWaitDone(BoardID, cmlY1, cmlFALSE) != cmlERR_NONE) // 에러메시지 ///////////////////////////////////////////////////////////// //위의 cmlSxWaitDone() 함수 대싞에 아래와 같이 cmlMxWaitDone() //함수를 사용하여 두축의 작업완료를 기다리는 것을 한번에 수행할 수 있다. // int nAxes[2] = {cmlX1, cmlY1}; // cmlMxWaitDone(BoardID, 2, nAxes, cmlFALSE); // 원점복귀의 성공 여부를 확인(確認)하여 처리한다. // long dwIsSuccess[2]; cmlHomeGetSuccess(BoardID, nAxis[0], &dwIsSuccess[0]); cmlHomeGetSuccess(BoardID, nAxis[1], &dwIsSuccess[1]); if(dwIsSuccess[0] && dwIsSuccess[1]){ MessageBox(NULL, ‚원점복귀를 성공적으로 수행하였습니다.‛, ‚Message‛, MB_OK) } .. code-block:: c++ :linenos: Visual Basic ‘BoardID 는 0으로 선언되었다고 가정함 ‘============================================================ ‘GnLoadDevice 함수로 장치를 초기화 합니다. ‘============================================================ Private Sub Form_Load() Dim nTotalDevices As Long Dim DeviceList(16) As Long Dim nTotalAxis As Long Dim IRetVal As Long '============================================================ ' GnLoadDevice 함수로 장치를 초기화합니다. ‘============================================================ IRetVal = GnLoadDevice(nTotalDevices, DeviceList(0), nTotalAxis) If IRetVal <> cmlERR_NONE Then MsgBox ("GnLoadDevice has been failed") End If End Sub ' 버튺 이벤트에 의해서 홈복귀를 시작합니다. Private Sub btnHome_Click() ' 각 축(Axis)의 기본 속도를 설정 합니다. ' X1 축의 홈복귀 모드를 설정합니다. Call HomeSetConfig(BoardID, cmlX1, cmlHPID_HOME_MODE, cmlHOME_MODE_ORG) ' Y1 축의 홈복귀 모드를 설정합니다. Call HomeSetConfig(BoardID, cmlY1, cmlHPID_HOME_MODE, cmlHOME_MODE_ORG) ' X1 축의 홈복귀 방향을 설정합니다. Call HomeSetConfig(BoardID, cmlX1, cmlHPID_HOME_DIR, cmlDIR_N) ' Y1 축의 홈복귀 방향을 설정합니다. Call HomeSetConfig(BoardID, cmlY1, cmlHPID_HOME_DIR, cmlDIR_N) ' X1 축의 홈복귀 추가 이동 거리를 설정합니다. Call HomeSetOffset(BoardID, cmlX1, 1000) ' Y1 축의 홈복귀 추가 이동 거리를 설정합니다. Call lHomeSetOffset(BoardID, cmlY1, 1000) ' X1 축 홈복귀 속도패턴 설정 // Call HomeSetSpeedPattern(BoardID, cmlX1, 0, cmlSPEED_SCURVE, m_fVwork0, m_fAcc0, m_fDec0) Call HomeSetSpeedPattern(BoardID, cmlX1, 1, cmlSPEED_SCURVE, m_fVwork1, m_fAcc1, m_fDec1) Call HomeSetSpeedPattern(BoardID, cmlX1, 2, cmlSPEED_SCURVE, m_fVwork2, m_fAcc2, m_fDec2) ' Y1 축 홈복귀 속도패턴 설정 // Call HomeSetSpeedPattern(BoardID, cmlY1, 0, cmlSPEED_SCURVE, m_fVwork0, m_fAcc0, m_fDec0) Call HomeSetSpeedPattern(BoardID, cmlY1, 1, cmlSPEED_SCURVE, m_fVwork1, m_fAcc1, m_fDec1) Call HomeSetSpeedPattern(BoardID, cmlY1, 2, cmlSPEED_SCURVE, m_fVwork2, m_fAcc2, m_fDec2) ' HomeMove(BoardID, 대상 축, 홈 복귀 방향, 블럭 여부) Call HomeMove(BoardID, cmlX1, GetDirection, cmlDIR_N, cmlFALSE ) Call HomeMove(BoardID, cmlY1, GetDirection, cmlDIR_N, cmlFALSE ) End Sub ' 홈 복귀 동작시 정지(停止)가 필요할 경우 동작합니다. Private Sub BtnStop_Click() Dim IsWaitComplete As Long Dim nResult As Long IsWaitComplete = True ' 정지(停止) 버튺을 누르게 되면 아래와 같이 모션 정지(停止) 함수가 호출되게 됩니다. ' 여기서 IsWaitComplete 는 모션 정지(停止)가 완료된 후 반홖 할 것인지, ' 모션 정지(停止) 명령 수행 후 바로 반홖 할 것인지를 결정합니다. nResult = SxStop(BoardID, cmlX1, IsWaitComplete, cmlFALSE) nResult = SxStop(BoardID, cmlY1, IsWaitComplete, cmlFALSE) End Sub